package com.psychologyCommunity.Community.Contoller.interceptor;

import com.psychologyCommunity.Community.annotation.LoginRequired;
import com.psychologyCommunity.Community.util.HostHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;

@Component
public class LoginRequiredInterceptor implements HandlerInterceptor {

    //当前用户
    @Autowired
    private HostHolder hostHolder;
    //什么时候判断？肯定是在请求执行前 就判断

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //首先我先判断一下拦截的对象 handler是不是一个方法 ，是方法我就处理，不是方法就不管，因为他还可能会拦截一些静态资源，所有的请求都拦截，但我们只判定方法
        //springMvc隐藏的规则，如果handler是方法的话 他就是HandlerMethod这个类型
        if(handler instanceof HandlerMethod){
            HandlerMethod handlerMethod=(HandlerMethod) handler;
            Method method = handlerMethod.getMethod();//先获得这个 方法 对象
            //人为的筛选了带注解的那部分动态资源
            LoginRequired l = method.getAnnotation(LoginRequired.class);//然后去拿方法上的注解（注解的类型 使我们自定义的注解类型）
            if(l!=null && hostHolder.getUser()==null){
                //当前用户不为空 重定向到登录页面--可以从请求路径中的获得相对路径--用户的想要访问的路径
                response.sendRedirect(request.getContextPath()+"/login");
            }

        }
        return true;
    }
}
